// 用户路由表

// 加载模块
let express = require('express');
let fs = require('fs');
let jwt = require('jsonwebtoken');
let template = require('art-template');
let sendMail = require('../utils/email.js');
let usersModel = require('../db/models/usersModel.js');

// 创建路由表(空表)
let router = express.Router();

// 向路由表添加内容:

// 验证是否已登录接口
router.get('/islogin',(req,res)=>{
    // console.log( req.session );// 服务端根据session id自动匹配到对应的session数据
    // if (req.session.islogin === 'is login') {
    //     // 已登录，响应请求
    //     res.send({"code":1,"msg":"用户已登录","userData":[req.session.username,req.session.nickname]});
    // } else {
    //     // 未登录
    //     res.send({"code":0,"msg":"用户未登录","userData":[]});
    // }

    // 获取token
    let token = req.headers.authorization;
    jwt.verify(token,'abc123',(err,payload)=>{
        if (err) {
            res.send({"code":0,"msg":"用户未登录","userData":[]});
        } else {
            res.send({"code":1,"msg":"用户已登录","userData":[payload.username,payload.nickname,payload.email]});
        }
    })
})

// 登录接口
// 接口地址：http://localhost:9999/users/login
// 请求方式：post
// 请求参数：username账号  password密码
// 返回值：{"code":1,"msg":"登录成功"}
router.post('/login',(req,res)=>{
    // 获取参数
    let {username,password} = req.body;

    // console.log( '参数：'+username,password );

    // 查询users数据集合
    usersModel.find({$and:[{username},{password}]})
    .then(
        (arr)=>{
            if (arr.length > 0) {
                // console.log( arr );
                // arr = [
                //     {
                //       _id: new ObjectId("64acfbb3e2ff4856034fc14f"),
                //       username: 'xiaocuo',
                //       password: '123123',
                //       nickname: '小错',
                //       email: '123456789@qq.com',
                //       age: 21,
                //       sex: '女',
                //       __v: 0
                //     }
                // ]

                // 向session中存储当前登录用户数据（初始化）
                // 此时，客户端cookie中会有一个session id
                // req.session.islogin = 'is login';// 标记已登录
                // req.session.email = arr[0].email;
                // req.session.username = arr[0].username;
                // req.session.nickname = arr[0].nickname;

                // 生成一个token
                let info = {// 当前登录的用户信息
                    email: arr[0].email,
                    username: arr[0].username,
                    nickname: arr[0].nickname
                }
                let token = jwt.sign(info,'abc123',{expiresIn:40});

                // 登录成功，响应请求
                res.send({"code":1,"msg":"登录成功","userData":[arr[0].email,arr[0].username,arr[0].nickname,arr[0].sex,arr[0].age],"token":token});

                // 重定向
                // res.redirect('https://www.baidu.com/');
            } else {
                // 登录失败，响应请求
                res.send({"code":0,"msg":"账号或密码错误"});
            }
        },
        (err)=>{
            // 登录失败，响应请求
            res.send({"code":-1,"msg":err});
        }
    )
    // res.send('login is ok');
});

// 缓存验证码
let cacheCode = {
    // '2239222721@qq.com': '626990',
    // '123456789@qq.com': '675355',
    // ...
}

// 注册接口
router.post('/register',(req,res)=>{
    // 获取参数
    let {username,password,nickname,email,age,sex,code} = req.body;

    // 校验注册验证码
    if (code !== cacheCode[email]) {
        return res.send({"code":-9999,"msg":"验证码错误"});
    }

    // 校验数据
    let reg1 = /^\w{6,16}$/;
    if (!reg1.test(username)) {
        return res.send({"code":-1,"msg":"账号格式错误"});
    }
    let reg2 = /^\w{6,16}$/;
    if (!reg2.test(password)) {
        return res.send({"code":-2,"msg":"密码格式错误"});
    }
    let reg3 = /^.{2,10}$/;
    if (!reg3.test(nickname)) {
        return res.send({"code":-3,"msg":"昵称格式错误"});
    }
    let reg4 = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
    if (!reg4.test(email)) {
        return res.send({"code":-4,"msg":"邮箱格式错误"});
    }
    let reg5 = /^\d{1,3}$/;
    if (!reg5.test(age)) {
        return res.send({"code":-5,"msg":"年龄格式错误"});
    }
    let reg6 = /^[男女妖]$/;
    if (!reg6.test(sex)) {
        return res.send({"code":-6,"msg":"性别格式错误"});
    }
    let reg7 = /^\d{4,8}$/;
    if (!reg7.test(code)) {
        return res.send({"code":-7,"msg":"验证码格式错误"});
    }

    // 查询username是否已注册
    usersModel.find({username})// p1
    .then(
        (arr)=>{
            if (arr.length > 0) {
                // 该账户已注册，不添加数据，响应请求
                res.send({"code":-8,"msg":"账号已存在"});
                // 终止链式调用
                return new Promise(()=>{});
            }
            else {
                // 该账户未注册，可以添加数据
                return usersModel.insertMany({username,password,nickname,email,age,sex});
            }
        },
        (err)=>{
            // 出错了，响应请求
            res.send({"code":-9,"msg":err});
        }
    )// p2
    .then(
        (arr)=>{
            if (arr.length > 0) {
                // 注册成功
                res.send({"code":1,"msg":"注册成功"});
            } else {
                // 注册失败
                res.send({"code":0,"msg":"注册失败"});
            }
        },
        (err)=>{
            res.send({"code":-9,"msg":err});
        }
    )

    // res.send('register is ok');
});

// 发送邮箱验证码
router.post('/sendmail',(req,res)=>{
    // 获取参数
    let {email} = req.body;

    // 生成随机验证码
    let code = parseInt(Math.random()*1000000)+'';

    // 发送邮件
    sendMail(email,'注册验证码',code)
    .then(
        ()=>{
            // 缓存验证码
            cacheCode[email] = code;

            // 响应请求
            res.send({"code":1,"msg":"邮件发送成功"});
        },
        ()=>{
            // 响应请求
            res.send({"code":0,"msg":"邮件发送失败"});
        }
    )
})

// 用户列表接口
router.get('/getlist',(req,res)=>{
    // 获取参数
    let {page,size} = req.query;
    console.log( `第${page}页数据，每页${size}条数据` );

    // 响应的数据
    let datas = [
        {"name":"张三","age":23},
        {"name":"李四","age":24},
        {"name":"王五","age":25},
        {"name":"马六","age":26}
    ]

    // 响应请求
    res.send(datas);
})


// 延迟响应接口
router.post('/delay',(req,res)=>{
    setTimeout(()=>{
        // 3秒后再响应请求
        res.send({"name":"张三","age":23});
    },3000);
})

// 测试接口1
router.get('/test1',(req,res)=>{
    res.send({"name":"老王","age":35,"sex":"女"});
});

// 测试接口2
router.get('/test2',(req,res)=>{
    let {a,b} = req.query;
    res.send({"code":1,"data":[a,b]});
});

// 测试接口3
router.post('/test3',(req,res)=>{
    res.send({"name":"老王","age":35,"sex":"女"});
});

// 测试接口4
router.post('/test4',(req,res)=>{
    let {a,b} = req.body;
    res.send({"code":1,"data":[a,b]});
});

// 测试接口5
router.post('/test5',(req,res)=>{
    let {money} = req.body;
    res.send({"code":1,"msg":"审批通过","money":money});
});

// 获取用户列表接口
router.get('/getusers',(req,res)=>{
    // 查询数据库
    usersModel.find()
    .then((arr)=>{
        res.send({"code":1,"msg":"获取成功","data":arr});
    })
    .catch((err)=>{
        res.send({"code":0,"msg":"获取失败","data":[]});
    })
})

// 服务端渲染接口1
router.get('/userList',(req,res)=>{
    // 查询数据库
    usersModel.find()
    .then((arr)=>{
        if (arr.length > 0) {
            // 在服务端完成页面html结构拼接
            let tmp = '';
            arr.forEach(item=>{
                tmp += `<tr>
                    <td>${item.username}</td>
                    <td>${item.nickname}</td>
                    <td>${item.password}</td>
                    <td>${item.email}</td>
                    <td>${item.sex}</td>
                    <td>${item.age}</td>
                </tr>`;
            });

            // 读取3-template1.html模板文件
            fs.readFile('./www/3-template1.html',(err,data)=>{
                if (err) {
                    // 响应请求
                    res.send('404 找不到页面');
                } else {
                    // 将data转成字符串
                    data += '';
                    // 使用tmp去替换data中的template
                    data = data.replace('template',tmp);
                    // 设置响应头
                    res.set('Content-Type','text/html;charset=utf-8');
                    // 响应请求
                    res.send(data);
                }
            })
        }
    })
});

// 服务端渲染接口2
router.get('/userList2',(req,res)=>{
    // 查询数据库
    usersModel.find()
    .then((arr)=>{
        if (arr.length > 0) {
            // 读取6-template2.html模板文件
            fs.readFile('./www/6-template2.html',(err,data)=>{
                if (err) {
                    // 响应请求
                    res.send('404 找不到页面');
                } else {
                    // 将data转成字符串
                    data += '';
                    // 使用数据去渲染模板
                    // template.render(模板,数据)返回拼接好的html结构
                    let result = template.render(data,{'data':arr});
                    // 设置响应头
                    res.set('Content-Type','text/html;charset=utf-8');
                    // 响应请求
                    res.send(result);
                }
            })
        }
    })
});

// ...


// 导出路由表
module.exports = router;
